package com.kkb.order.client;

import entity.Payment;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 在注解@FeignClient注解中，“eureka-pay”是服务名。
 * 使⽤这个名字来从Eureka服务列表中得到相应的服务，来创建LoadBalancer客户端，也可以使⽤url属性，指定服务的URL。
 */
@FeignClient(value = "eureka-pay", fallbackFactory = PayClient.MyFallBackFactory.class)
public interface PayClient {
    //这个mapping中的地址必须和eureka-pay服务中controller里面的mapping地址一模一样
    @RequestMapping("/pay/{id}")
    ResponseEntity<Payment> doPayFeign(@PathVariable("id") Integer id);

//    @Component
    class MyFallback implements PayClient{

        @Override
        public ResponseEntity<Payment> doPayFeign(Integer id) {
            Payment payment = new Payment(id, "熔断器降级方法返回！！！");
            return ResponseEntity.ok(payment);
        }
    }

    /*
        如果想要获得熔断降级的异常信息，比如打印异常日志，则可以使用fallbackFactory属性指定，代码如下。同时还要配置@FeignClient注解的fallbackFactory属性
     */
    @Component
    class MyFallBackFactory implements FallbackFactory<MyFallback> {

        @Override
        public MyFallback create(Throwable cause) {
            cause.printStackTrace();
            return new MyFallback();
        }
    }
}
